/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador.analisadorSintatico.operacoes;

import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;

/**
 *
 * @author Joao
 */
public class VALOR_NUM extends Producao{

    //<VALOR_NUM> ::= <exp_arit> | <EXP_INC>

    @Override
    public SimboloGramatical derivar() throws Exception
    {
        TokenReader tokenReader =  TokenReader.getInstance();

        NaoTerminal VALOR_NUM = new NaoTerminal("VALOR_NUM");

        Token t = tokenReader.seeCurrent();


        if(t.getAtributo().equals("(") || t.getTokenClass().equals(TokenClass.NUMERO))
        {
            VALOR_NUM.add(new EXP_ARIT().derivar());
            simbolo = VALOR_NUM;
        }
        else if (t.getTokenClass().equals(TokenClass.IDENTIFICADOR) && 
                (tokenReader.seeNext().getAtributo().equals("++")||tokenReader.seeNext().getAtributo().equals("--")))
        {
            VALOR_NUM.add(new EXP_INC().derivar());
            simbolo = VALOR_NUM;
        }
        else if(t.getTokenClass().equals(TokenClass.IDENTIFICADOR) || t.getTokenClass().equals(TokenClass.OPERADOR))
        {
            VALOR_NUM.add(new EXP_ARIT().derivar());
            simbolo = VALOR_NUM;
        }
        else{
            erro("Valor numérico na linha "+t.getLinha()+
                  " perto de '"+t.getAtributo().toString()+
                  "' não pode ser reconhecido");
            return this.simbolo;
        }

        /*
            t = tokenReader.seeNext();
            if(t.getTokenClass().equals(TokenClass.OPERADOR) && t.getAtributo().equals("++"))
            {
                t = tokenReader.consome();
                VALOR_NUM.add(new OP_INC().derivar());
            }
        */
        return simbolo;
    }

    @Override
    public void setSimbolo() {
        super.simbolo = new NaoTerminal("VALOR_NUM");
    }
}



